//这里使用一个FIFO的预测判别器来记录访问的序列，记录32位纵深
//通过淘汰下来的数据块查看当前数据块是不是被命中的来判定预测的正确率
//在FIFO队列中我们只存储预读的序列，并且在每次淘汰元素的的时候当前的
//的预测错误率
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_HISTORY_DEEP 32

//一个链表节点
typedef struct __history_unit{
    //这是一个双向链表
    struct __history_unit* next;
    struct __history_unit* prev;

    //当前访问的节点
    long access_block;

    //会否被访问
    short is_accessed;
}history_unit_t;

//这里是预测评价器的主体
typedef struct __predict_evaluation{
    //这里是一个链表头部
    history_unit_t* history_head;

    //当前已经存储的历史数量
    int history_size;

    //已经从队列中退出的节点数量
    long history_count;

    //退出的节点中，错误节点的数量
    long err_count;
}predict_evaluation_t;

//评价器的初始化
void init_predict_evaluation(predict_evaluation_t* predict_evaluation);

//将预测的节点写入
void insert_predict_history(predict_evaluation_t* predict_evaluation, long predict_block);

//传入当前访问的数据块来查看预测是不是成功
void update_predict_evaluation(predict_evaluation_t* predict_evaluation, long now_access);